package myjdbc;

import java.io.*;
import java.sql.*;

import static java.lang.Class.forName;

/**
 * @Auther: cty
 * @Date: 2020/1/21 16:02
 * @Description:  测试CLOB类型存取
 * CLOB Character Large Object 字符大对象
 * 用于存储大量的文本数据，大字段的操作以流的方式来处理，只能用setClob()来设置参数
 * MySQL中的相关类型：
 *      * TINYTEXT  最大长度为255(2^[8]–1)字符的TEXT列。
 *      * TEXT[(M)]  最大长度为65,535(2^[16]–1)字符的TEXT列。
 *      * MEDIUMTEXT  最大长度为16,777,215(2^[24]–1)字符的TEXT列。
 *      * LONGTEXT  最大长度为4,294,967,295或4GB(2^[32]–1)字符的TEXT列。
 *
 * @version: 1.0
 */
public class JDBC_Demo07_CLOB {

    public static final String URL = "jdbc:mysql://localhost:3306/testjdbc";
    public static final String USER = "root";
    public static final String PWD = "123456";

    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Reader r = null;

        try {
            //1 加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            //2 获取数据库连接
            conn = DriverManager.getConnection(URL,USER,PWD);
            //3 操作数据库
            //（1）存入CLOB类型数据
            String sql = "insert into user (username,infoClob) values (?,?)";
            ps = conn.prepareStatement(sql);
            ps.setObject(1,"cty");
            ps.setClob(2,new FileReader("src/jdbc.txt"));  //注意不能用setObject()!
            ps.executeUpdate();
            System.out.println("存入一条包含CLOB类型数据的记录！");

            //（2）读取CLOB类型数据1
            sql = "select * from user";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();

            //4 处理返回数据
            while(rs.next()){
                //读取CLOB类型数据2
                Clob c = rs.getClob("infoClob");
                if(c!=null){
                    System.out.println("读取一条包含CLOB类型数据的记录：");
                    r = c.getCharacterStream();
                    char[] flush = new char[1024];
                    int len = 0;
                    while((len=r.read(flush))!=-1){
                        String str = new String(flush,0,len);
                        System.out.println("id:"+rs.getInt("id")+
                                "————username:"+rs.getString("username")+
                                "————infoClob:"+str);
                    }
                }
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //5 关闭连接
            try {
                if(r!=null){
                    r.close();
                }
                if(rs!=null){
                    rs.close();
                }
                if(ps!=null){
                    ps.close();
                }
                if(conn!=null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

/* res:
存入一条包含CLOB类型数据的记录！
读取一条包含CLOB类型数据的记录：
id:22007————username:cty————infoClob:hello, cty!
* */
